home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / turbo.mod < prev    next >
Text File  |  2000-09-26  |  54KB  |  2,132 lines

  1. (*$S- *)
  2. (* R-, T-, A- *)
  3. MODULE Turbo;
  4.  
  5. FROM SYSTEM           IMPORT BYTE,ADR,ADDRESS,ASSEMBLER,OFFSET,SEGMENT,OFS,SEG;
  6. FROM System           IMPORT AX,BX,CX,DX,ES,DI,DS,SI,BP,Trap,XTrap,SetVector,GetVector,
  7.                              ResetVector,Move,Terminate,FLAGS,zeroFlag;
  8. FROM Strings          IMPORT Length,Assign,Insert,Delete;
  9. FROM Storage          IMPORT ALLOCATE,DEALLOCATE;
  10. FROM TimeDate         IMPORT Time,GetTime;
  11. FROM NumberConversion IMPORT NumToString;
  12. FROM Loader           IMPORT Execute;
  13. FROM InOut            IMPORT WriteString,WriteLn;
  14.  
  15. FROM TurboSys IMPORT STRING,tdos,
  16.                      interruptVector,memoryVector,
  17.                      WindowPtr,MenuPtr,SysMsgPtr,TurboDOSPtr,GadgetPtr,
  18.                      Window,Menu,SysMsg,TurboDOS,Gadget,
  19.                      boolGadget,strGadget,intGadget,toggleGadget,propGadget,
  20.                      WindowFlags,WindowFlagSet,
  21.                      MouseButtons,MouseButtonSet,
  22.                      SysMsgClasses,SysMsgClassSet,
  23.                      ItemFlags,ItemFlagSet,
  24.                      stdItem,bar,check;
  25. IMPORT TurboSys;
  26.  
  27. FROM Break IMPORT InstallBreakHandler,UninstallBreakHandler,EnableBreak;
  28.  
  29. CONST
  30.  timerVector = 01CH;
  31.  
  32.  version     = 0005;
  33.  welcome     = "Willkommen zu TurboDOS Version 0.5!";
  34.  
  35.  patternScreenBackgrnd = 176;
  36.  patternWindowBackgrnd = 32;
  37.  
  38.  colorWindowBackgrnd = (3*16);
  39.  colorScreenBackgrnd = 14;
  40.  colorAWindowBorders = 6+(3*16);
  41.  colorIWindowBorders = 9+(3*16);
  42.  colorWindowAPen     = 14;
  43.  colorWindowBPen     = 3;
  44.  colorGadget         = 12+(3*16);
  45.  colorGadgetSelected = 14+(3*16);
  46.  colorGadgetDisabled = 8+(3*16);
  47.  colorHelpBar        = 14+(3*16);
  48.  colorMove           = 14+(15*16);
  49.  
  50.  colorMenuBar        = 14+(3*16);
  51.  colorMenuEnabled    = 14+(3*16);
  52.  colorMenuDisabled   = 12+(3*16);
  53.  colorMenuSelected   = 9+(15*16);
  54.  colorMenuBorder     = 7+(3*16);
  55.  
  56.  videoWidth          = 80;
  57.  videoHeight         = 25;
  58.  videoMode           = 03H;
  59.  
  60.  closeGadget = 100;
  61.  depthGadget = 101;
  62.  sizeGadget  = 102;
  63.  
  64.  noMemory = 100;
  65.  noMouse  = 101;
  66.  
  67. VAR a,b,c,d : CARDINAL;
  68.     w1,w2,w3,w4,w5,w6 : WindowPtr;
  69.     t1,t2,t3,t4,t5,t6 : ARRAY [0..79] OF CHAR;
  70.     g1,g2,g3,g4,g5,g6,g7,g8,g9 : Gadget;
  71.     m1,m2             : Menu;
  72.     adr : ADDRESS;
  73.  
  74.  
  75.     oldColors    : ARRAY [0..(16*3)] OF BYTE;
  76.     oldVector1,
  77.     oldVector2,
  78.     oldVector3   : ADDRESS;
  79.  
  80.     timerCounter : CARDINAL;
  81.     timerUpdate  : BOOLEAN;
  82.  
  83. PROCEDURE F1;
  84. BEGIN
  85.  timerCounter := timerCounter + 1;
  86.  IF (timerCounter>10) THEN
  87.   timerCounter := 0;
  88.   timerUpdate  := TRUE;
  89.  END (* IF *);
  90. END F1;
  91.  
  92. PROCEDURE TimerInterrupt;
  93. BEGIN
  94.  ASM
  95.   CALL F1
  96.   IRET
  97.  END (* ASM *);
  98. END TimerInterrupt;
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. PROCEDURE RestoreCursor;
  112. BEGIN
  113.  AX := 0200H;
  114.  BX := 0;
  115.  DX := tdos^.cursorPos;
  116.  Trap(010H);
  117. END RestoreCursor;
  118.  
  119. PROCEDURE SetCursor(a,b : CARDINAL);
  120. BEGIN
  121.  tdos^.cursorPos := (b*256)+a;
  122.  AX := 0200H;
  123.  BX := 0;
  124.  DX := tdos^.cursorPos;
  125.  Trap(010H);
  126. END SetCursor;
  127.  
  128. PROCEDURE CopyVideo2Buffer(buffer  : ADDRESS;
  129.                            x,y,w,h : CARDINAL);
  130. VAR video : ADDRESS;
  131.     j     : CARDINAL;
  132.     bpr   : CARDINAL;
  133. BEGIN
  134.  video.SEG := 0B800H;
  135.  video.OFS := y*tdos^.videoBPR+(x*2);
  136.  bpr       := w*2;
  137.  FOR j := y TO y+h DO
  138.   Move(video,buffer,bpr);
  139.   buffer.OFS := buffer.OFS + bpr;
  140.   video.OFS  := video.OFS + 160;
  141.  END (* FOR *);
  142. END CopyVideo2Buffer;
  143.  
  144. PROCEDURE CopyBuffer2Video(buffer  : ADDRESS;
  145.                            x,y,w,h : CARDINAL);
  146. VAR video : ADDRESS;
  147.     j     : CARDINAL;
  148.     bpr   : CARDINAL;
  149. BEGIN
  150.  video.SEG := 0B800H;
  151.  video.OFS := y*tdos^.videoBPR+(x*2);
  152.  bpr       := w*2;
  153.  FOR j := y TO y+h DO
  154.   Move(buffer,video,bpr);
  155.   buffer.OFS := buffer.OFS + bpr;
  156.   video.OFS  := video.OFS + 160;
  157.  END (* FOR *);
  158. END CopyBuffer2Video;
  159.  
  160. PROCEDURE WriteText(attribut : CARDINAL;
  161.                     x,y      : CARDINAL;
  162.                     text     : STRING);
  163. VAR l,o,s,to,ts : CARDINAL;
  164. BEGIN
  165.  l  := Length(text^);
  166.  IF (l=0) THEN RETURN; END;
  167.  s  := 0B800H;
  168.  o  := (y*tdos^.videoBPR)+(x*2);
  169.  ts := text.SEG;
  170.  to := text.OFS;
  171.  ASM
  172.   MOV ES,s
  173.   MOV DI,o
  174.   MOV DS,ts
  175.   MOV SI,to
  176.   MOV CX,l
  177.   MOV AX,attribut
  178.  Schleife:
  179.   MOV AH,DS:[SI]
  180.   MOV ES:[DI],AH
  181.   MOV ES:[DI+1],AL
  182.   ADD DI,2
  183.   ADD SI,1
  184.   SUB CX,1
  185.   CMP CX,0
  186.   JNE Schleife
  187.  END (* ASM *);
  188.  RestoreCursor;
  189. END WriteText;
  190.  
  191. PROCEDURE Fill(attribut,
  192.                x,y,w,h   : CARDINAL;
  193.                zeichen   : CARDINAL);
  194. VAR i : CARDINAL;
  195. BEGIN
  196.  FOR i := y TO y+h DO
  197.   AX := 0200H;
  198.   BX := 0;
  199.   DX := (i*256)+x;
  200.   Trap(010H);
  201.   AX := 0900H+zeichen;
  202.   BX := attribut;
  203.   CX := w;
  204.   Trap(010H);
  205.  END (* FOR *);
  206.  RestoreCursor;
  207. END Fill;
  208.  
  209. PROCEDURE DrawX(attribut,
  210.                 x,y,l,
  211.                 zeichen   : CARDINAL);
  212. BEGIN
  213.  AX := 0200H;
  214.  BX := 0;
  215.  DX := (y*256)+x;
  216.  Trap(010H);
  217.  AX := 0900H+zeichen;
  218.  BX := attribut;
  219.  CX := l;
  220.  Trap(010H);
  221.  RestoreCursor;
  222. END DrawX;
  223.  
  224. PROCEDURE DrawY(attribut,
  225.                 x,y,l,
  226.                 zeichen   : CARDINAL);
  227. VAR j : CARDINAL;
  228. BEGIN
  229.  FOR j := y TO y+l DO
  230.   AX := 0200H;
  231.   BX := 0;
  232.   DX := (j*256)+x;
  233.   Trap(010H);
  234.   AX := 0900H+zeichen;
  235.   BX := attribut;
  236.   CX := 1;
  237.   Trap(010H);
  238.  END (* FOR *);
  239.  RestoreCursor;
  240. END DrawY;
  241.  
  242. PROCEDURE DrawWindowBorder(win    : WindowPtr;
  243.                            active : BOOLEAN);
  244. VAR tex : ARRAY [0..5] OF CHAR;
  245.     j,c : CARDINAL;
  246. BEGIN
  247.  j := Length(win^.title);
  248.  IF (active=TRUE) THEN c := tdos^.colorAWindowBorders; ELSE c := tdos^.colorIWindowBorders; END;
  249.  DrawX(c,win^.leftEdge,win^.topEdge+win^.height,win^.width,205);
  250.  DrawX(c,win^.leftEdge,win^.topEdge+win^.height,1,200);
  251.  DrawX(c,win^.leftEdge+j,win^.topEdge,win^.width-j,205);
  252.  DrawX(c,win^.leftEdge,win^.topEdge,1,201);
  253.  DrawX(c,win^.leftEdge+4,win^.topEdge,1,205);
  254.  
  255.  IF (windowClose IN win^.flags) THEN
  256.   tex[0] := "[";
  257.   tex[1] := 11C;
  258.   tex[2] := "]";
  259.   tex[3] := 0C;
  260.   WriteText(tdos^.colorGadget,win^.leftEdge+1,win^.topEdge,ADR(tex));
  261.  END (* IF *);
  262.  
  263.  IF (windowDepth IN win^.flags) THEN
  264.   tex[0] := "[";
  265.   tex[1] := 37C;
  266.   tex[2] := "]";
  267.   tex[3] := 0C;
  268.   WriteText(tdos^.colorGadget,win^.leftEdge+win^.width-4,win^.topEdge,ADR(tex));
  269.  END (* IF *);
  270.  
  271.  IF (j<win^.width+10) THEN
  272.   WriteText(c,win^.leftEdge+5,win^.topEdge,ADR(win^.title));
  273.  END (* IF *);
  274.  
  275.  DrawY(c,win^.leftEdge,win^.topEdge+1,win^.height-2,186);
  276.  DrawY(c,win^.leftEdge+win^.width-1,win^.topEdge+1,win^.height-2,186);
  277.  DrawX(c,win^.leftEdge+win^.width-1,win^.topEdge,1,187);
  278.  IF NOT (windowSizing IN win^.flags) THEN
  279.   DrawX(c,win^.leftEdge+win^.width-1,win^.topEdge+win^.height,1,188);
  280.  ELSE
  281.   DrawX(tdos^.colorGadget,win^.leftEdge+win^.width-1,win^.topEdge+win^.height,1,29);
  282.  END (* IF *);
  283.  RestoreCursor;
  284. END DrawWindowBorder;
  285.  
  286. PROCEDURE InactivateWindow(win : WindowPtr);
  287. BEGIN
  288.  DrawWindowBorder(win,FALSE);
  289.  CopyVideo2Buffer(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  290. END InactivateWindow;
  291.  
  292. PROCEDURE ShowMenuStrip(win : WindowPtr);
  293. VAR menu : MenuPtr;
  294. BEGIN
  295.  DrawX(tdos^.colorMenuBar,0,0,tdos^.videoWidth,32);
  296.  menu := win^.firstMenu;
  297.  WHILE (menu # NIL) DO
  298.   WriteText(tdos^.colorMenuBar,menu^.leftEdge,0,ADR(menu^.title));
  299.   menu := menu^.nextMenu;
  300.  END (* WHILE *);
  301. END ShowMenuStrip;
  302.  
  303. PROCEDURE ShowMenu(menu : MenuPtr);
  304. BEGIN
  305.  MouseOff;
  306.  tdos^.firstWindow^.firstMenu := menu;
  307.  ShowMenuStrip(tdos^.firstWindow);
  308.  RestoreCursor;
  309.  MouseOn;
  310. END ShowMenu;
  311.  
  312. PROCEDURE ActWin(win : WindowPtr);
  313. BEGIN
  314.  CopyBuffer2Video(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  315.  DrawWindowBorder(win,TRUE);
  316.  tdos^.cursorPos   := win^.cursorPos+(win^.topEdge*256)+win^.leftEdge;
  317.  ShowMenuStrip(win);
  318.  RestoreCursor;
  319. END ActWin;
  320.  
  321. PROCEDURE ActivateWindow(win : WindowPtr);
  322. VAR w2 : WindowPtr;
  323. BEGIN
  324.  IF (tdos^.firstWindow # win) THEN
  325.   MouseOff;
  326.   InactivateWindow(tdos^.firstWindow);
  327.   w2 := tdos^.firstWindow;
  328.   WHILE (w2^.nextWindow # win) DO
  329.    w2 := w2^.nextWindow;
  330.   END (* WHILE *);
  331.   w2^.nextWindow    := win^.nextWindow;
  332.   win^.nextWindow   := tdos^.firstWindow;
  333.   tdos^.firstWindow := win;
  334.   ActWin(win);
  335.   MouseOn;
  336.  END (* IF *);
  337. END ActivateWindow;
  338.  
  339. PROCEDURE OpenWindow(win : WindowPtr);
  340. VAR j : CARDINAL;
  341. BEGIN
  342.  j := Length(win^.title)+3;
  343.  MouseOff;
  344.  IF (tdos^.firstWindow # NIL) THEN
  345.   InactivateWindow(tdos^.firstWindow);
  346.  END (* IF *);
  347.  win^.topEdge := win^.topEdge + 1;
  348.  win^.height  := win^.height + 1;
  349.  IF ((win^.leftEdge+win^.width)>tdos^.videoWidth) THEN
  350.   win^.width := tdos^.videoWidth-win^.leftEdge;
  351.  END (* IF *);
  352.  IF ((win^.topEdge+win^.height)>tdos^.videoMaxY) THEN
  353.   win^.height := tdos^.videoMaxY-win^.topEdge-1;
  354.  END (* IF *);
  355.  IF (requester IN win^.flags) THEN
  356.   CopyVideo2Buffer(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  357.   MouseLimits(win^.leftEdge,win^.topEdge,win^.leftEdge+win^.width-1,win^.topEdge+win^.height);
  358.  END (* IF *);
  359.  Fill(tdos^.colorWindowBackgrnd,
  360.       win^.leftEdge,win^.topEdge,win^.width,win^.height,
  361.       tdos^.patternWindowBackgrnd);
  362.  win^.nextWindow   := tdos^.firstWindow;
  363.  DrawWindowBorder(win,TRUE);
  364.  tdos^.firstWindow := win;
  365.  win^.frontPen  := tdos^.colorWindowAPen;
  366.  win^.backPen   := tdos^.colorWindowBPen;
  367.  win^.cursorPos := 05050H;
  368.  win^.firstGadget := NIL;
  369.  win^.firstMenu   := NIL;
  370.  win^.maxWindow   := FALSE;
  371.  IF (windowClose IN win^.flags) THEN
  372.   win^.sysGadgets[0].nextGadget := NIL;
  373.   win^.sysGadgets[0].leftEdge := 1;
  374.   win^.sysGadgets[0].topEdge := 0;
  375.   win^.sysGadgets[0].width := 2;
  376.   win^.sysGadgets[0].height := 1;
  377.   win^.sysGadgets[0].text[0] := "[";
  378.   win^.sysGadgets[0].text[1] := 11C;
  379.   win^.sysGadgets[0].text[2] := "]";
  380.   win^.sysGadgets[0].text[3] := 0C;
  381.   win^.sysGadgets[0].type := closeGadget;
  382.   win^.sysGadgets[0].enabled := TRUE;
  383.   IF (requester IN win^.flags) THEN
  384.    win^.sysGadgets[0].help := "Requester schließen...";
  385.   ELSE
  386.    win^.sysGadgets[0].help := "Fenster schließen...";
  387.   END (* IF *);
  388.   ShowGadget(ADR(win^.sysGadgets[0]));
  389.   j := j + 3;
  390.  END (* IF *);
  391.  IF NOT (requester IN win^.flags) THEN
  392.   IF (windowDepth IN win^.flags) THEN
  393.    win^.sysGadgets[1].nextGadget := NIL;
  394.    win^.sysGadgets[1].leftEdge := win^.width-4;
  395.    win^.sysGadgets[1].topEdge := 0;
  396.    win^.sysGadgets[1].width := 2;
  397.    win^.sysGadgets[1].height := 1;
  398.    win^.sysGadgets[1].text[0] := "[";
  399.    win^.sysGadgets[1].text[1] := 37C;
  400.    win^.sysGadgets[1].text[2] := "]";
  401.    win^.sysGadgets[1].text[3] := 0C;
  402.    win^.sysGadgets[1].type    := depthGadget;
  403.    win^.sysGadgets[1].enabled := TRUE;
  404.    win^.sysGadgets[1].help := "Fenster in den Hintergrund bringen...";
  405.    ShowGadget(ADR(win^.sysGadgets[1]));
  406.    j := j + 3;
  407.   END (* IF *);
  408.   IF (windowSizing IN win^.flags) THEN
  409.    win^.sysGadgets[2].nextGadget := NIL;
  410.    win^.sysGadgets[2].leftEdge := win^.width-1;
  411.    win^.sysGadgets[2].topEdge := win^.height;
  412.    win^.sysGadgets[2].width := 1;
  413.    win^.sysGadgets[2].height := 1;
  414.    win^.sysGadgets[2].text[0] := 35C;
  415.    win^.sysGadgets[2].text[1] := 0C;
  416.    win^.sysGadgets[2].type := sizeGadget;
  417.    win^.sysGadgets[2].enabled := TRUE;
  418.    win^.sysGadgets[2].help := "";
  419.    ShowGadget(ADR(win^.sysGadgets[2]));
  420.   END (* IF *);
  421.  END (* IF *);
  422.  IF (win^.minWidth<j) THEN
  423.   win^.minWidth := j;
  424.  END (* IF *);
  425.  ShowMenuStrip(win);
  426.  tdos^.cursorPos := 05050H;
  427.  RestoreCursor;
  428.  MouseOn;
  429. END OpenWindow;
  430.  
  431. PROCEDURE GetMouseData;
  432. VAR x,y : CARDINAL;
  433.     b   : MouseButtonSet;
  434. BEGIN
  435.  IF (timerUpdate=TRUE) THEN
  436.   timerUpdate := FALSE;
  437.   ShowClock;
  438.  END (* IF *);
  439.  ASM
  440.   MOV AX,3
  441.   INT 033H
  442.   MOV x,CX
  443.   MOV y,DX
  444.   MOV b,BX
  445.  END (* ASM *);
  446.  tdos^.mouseX       := x DIV 8;
  447.  tdos^.mouseY       := y DIV 8;
  448.  tdos^.mouseButtons := b;
  449. END GetMouseData;
  450.  
  451. PROCEDURE MouseReset;
  452. BEGIN
  453.  AX := 0;
  454.  Trap(033H);
  455. END MouseReset;
  456.  
  457. PROCEDURE MouseOff;
  458. BEGIN
  459.  DEC(tdos^.mouseLock);
  460.  IF (tdos^.mouseLock=0) THEN
  461.   AX := 2;
  462.   Trap(033H);
  463.  END (* IF *);
  464. END MouseOff;
  465.  
  466. PROCEDURE MouseOn;
  467. BEGIN
  468.  INC(tdos^.mouseLock);
  469.  IF (tdos^.mouseLock=1) THEN
  470.   AX := 1;
  471.   Trap(033H);
  472.  END (* IF *);
  473. END MouseOn;
  474.  
  475. PROCEDURE MouseLimits(x1,y1,x2,y2 : CARDINAL);
  476. BEGIN
  477.  AX := 7;
  478.  CX := x1*8;
  479.  DX := x2*8;
  480.  Trap(033H);
  481.  AX := 8;
  482.  CX := y1*8;
  483.  DX := y2*8;
  484.  Trap(033H);
  485. END MouseLimits;
  486.  
  487. PROCEDURE xMove(x,y : CARDINAL);
  488. BEGIN
  489.  MouseOff;
  490.  SetCursor(x,y);
  491.  MouseOn;
  492.  tdos^.firstWindow^.cursorPos := tdos^.cursorPos;
  493. END xMove;
  494.  
  495. PROCEDURE SetAPen(farbe : CARDINAL);
  496. BEGIN
  497.  tdos^.firstWindow^.frontPen := farbe;
  498. END SetAPen;
  499.  
  500. PROCEDURE SetBPen(farbe : CARDINAL);
  501. BEGIN
  502.  tdos^.firstWindow^.backPen := farbe;
  503. END SetBPen;
  504.  
  505. PROCEDURE Text(text : STRING);
  506. VAR p,attribut,l : CARDINAL;
  507.     win          : WindowPtr;
  508. BEGIN
  509.  win             := tdos^.firstWindow;
  510.  p               := win^.cursorPos+(win^.topEdge*256)+win^.leftEdge;
  511.  l               := Length(text^);
  512.  tdos^.cursorPos := p + l;
  513.  win^.cursorPos  := win^.cursorPos + l;
  514.  attribut        := win^.frontPen + (win^.backPen*16);
  515.  MouseOff;
  516.  WriteText(attribut,p MOD 256,p DIV 256,text);
  517.  MouseOn;
  518. END Text;
  519.  
  520. PROCEDURE CenterText(y    : CARDINAL;
  521.                      text : STRING);
  522. VAR win : WindowPtr;
  523.     x,l : CARDINAL;
  524. BEGIN
  525.  win  := tdos^.firstWindow;
  526.  l    := Length(text^);
  527.  x    := ((win^.width-l) DIV 2)+win^.leftEdge;
  528.  WriteText(win^.frontPen+(win^.backPen*16),x,y+win^.topEdge,text);
  529. END CenterText;
  530.  
  531. PROCEDURE RestoreWindows(win : WindowPtr);
  532. BEGIN
  533.  IF (win^.nextWindow # NIL) THEN
  534.   RestoreWindows(win^.nextWindow);
  535.  END (* IF *);
  536.  CopyBuffer2Video(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  537. END RestoreWindows;
  538.  
  539. PROCEDURE CloseWindow;
  540. VAR win : WindowPtr;
  541. BEGIN
  542.  win := tdos^.firstWindow;
  543.  IF (win # NIL) THEN
  544.   MouseOff;
  545.   tdos^.firstWindow := win^.nextWindow;
  546.   IF NOT (requester IN win^.flags) THEN
  547.    Fill(tdos^.colorScreenBackgrnd,win^.leftEdge,win^.topEdge,win^.width,win^.height,tdos^.patternScreenBackgrnd);
  548.    RestoreWindows(tdos^.firstWindow);
  549.   ELSE
  550.    CopyBuffer2Video(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  551.    MouseLimits(0,0,tdos^.videoMaxX,tdos^.videoMaxY-1);
  552.   END (* IF *);
  553.   IF (win^.nextWindow # NIL) THEN
  554.    ActWin(win^.nextWindow);
  555.   END (* IF *);
  556.   RestoreCursor;
  557.   MouseOn;
  558.  END (* IF *);
  559. END CloseWindow;
  560.  
  561. PROCEDURE KeyboardReset;
  562. VAR bool : BOOLEAN;
  563. BEGIN
  564.  bool := FALSE;
  565.  REPEAT
  566.   AX := 0100H;
  567.   Trap(016H);
  568.   IF NOT (zeroFlag IN FLAGS) THEN
  569.    AX := 0;
  570.    Trap(016H);
  571.   ELSE
  572.    bool := TRUE;
  573.   END (* IF *);
  574.  UNTIL (bool=TRUE);
  575. END KeyboardReset;
  576.  
  577. PROCEDURE StrText(farbe,
  578.                   x,y,w  : CARDINAL;
  579.                   buffer : STRING);
  580. VAR j : CARDINAL;
  581. BEGIN
  582.  j := Length(buffer^);
  583.  DrawX(farbe,x,y,w-2,250);
  584.  WriteText(farbe,x,y,buffer);
  585. END StrText;
  586.  
  587. PROCEDURE StrGadgetHandler(gad : GadgetPtr);
  588. VAR win    : WindowPtr;
  589.     cursor,
  590.     x,x2,
  591.     y,c,l,
  592.     a,b    : CARDINAL;
  593.     ch     : CHAR;
  594.     array  : ARRAY [0..1] OF CHAR;
  595.  
  596.  PROCEDURE GetChr(VAR a,b : CARDINAL;
  597.                   VAR   c : CHAR);
  598.  VAR a1,b1 : CARDINAL;
  599.      c1    : CHAR;
  600.  BEGIN
  601.   GetMouseData;
  602.   IF ((left IN tdos^.mouseButtons)) THEN
  603.    c := 15C;
  604.    a := 0;
  605.    b := 0;
  606.   ELSE
  607.    AX := 0100H;
  608.    Trap(016H);
  609.    IF NOT(zeroFlag IN FLAGS) THEN
  610.     ASM
  611.      MOV AH,0
  612.      INT 016H
  613.      MOV BL,AL
  614.      XOR BH,BH
  615.      MOV a1,BX
  616.      MOV BL,AH
  617.      XOR BH,BH
  618.      MOV b1,BX
  619.      XOR AH,AH
  620.      MOV c1,AL
  621.     END (* ASM *);
  622.     a := a1; b := b1; c := c1;
  623.    ELSE
  624.     a := 0;
  625.     b := 0;
  626.    END (* IF *);
  627.   END (* IF *);
  628.  END GetChr;
  629.  
  630. BEGIN
  631.  cursor := tdos^.cursorPos;
  632.  win := tdos^.firstWindow;
  633.  x   := win^.leftEdge+gad^.leftEdge+1;
  634.  x2  := gad^.width-2;
  635.  y   := win^.topEdge+gad^.topEdge;
  636.  l   := Length(gad^.buffer^);
  637.  IF NOT (tdos^.mouseX=win^.leftEdge+gad^.leftEdge) THEN
  638.   c := tdos^.mouseX-win^.leftEdge-gad^.leftEdge-1;
  639.   IF (c>l) THEN
  640.    c   := l;
  641.   END (* IF *);
  642.  ELSE
  643.   c := 0;
  644.  END (* IF *);
  645.  KeyboardReset;
  646.  MouseOff;
  647.  StrText(tdos^.colorGadgetSelected,x,y,gad^.width,gad^.buffer);
  648.  SetCursor(x+c,y);
  649.  MouseOn;
  650.  array[1] := 0C;
  651.  
  652.  REPEAT
  653.   GetChr(a,b,ch);
  654.   IF NOT (a=0) THEN
  655.    IF (a>30) THEN
  656.     IF (l<x2) THEN
  657.      array[0] := ch;
  658.      Insert(array,gad^.buffer^,c);
  659.      c := c + 1;
  660.      l := l + 1;
  661.     END (* IF *);
  662.     MouseOff;
  663.     StrText(tdos^.colorGadgetSelected,x,y,gad^.width,gad^.buffer);
  664.     SetCursor(x+c,y);
  665.     MouseOn;
  666.    ELSIF (b=14) THEN
  667.     IF (c>0) THEN
  668.      Delete(gad^.buffer^,c-1,1);
  669.      c := c - 1;
  670.      l := l - 1;
  671.      MouseOff;
  672.      StrText(tdos^.colorGadgetSelected,x,y,gad^.width,gad^.buffer);
  673.      SetCursor(x+c,y);
  674.      MouseOn;
  675.     END (* IF *);
  676.    END (* IF *);
  677.   ELSE
  678.    CASE b OF
  679.     75:
  680.      IF (c>0) THEN
  681.       c := c - 1;
  682.       SetCursor(x+c,y);
  683.      END (* IF *);|
  684.     77:
  685.      IF (c<l) THEN
  686.       c := c + 1;
  687.       SetCursor(x+c,y);
  688.      END (* IF *);|
  689.     83:
  690.      IF (c<l) THEN
  691.       Delete(gad^.buffer^,c,1);
  692.       l := l - 1;
  693.       MouseOff;
  694.       StrText(tdos^.colorGadgetSelected,x,y,gad^.width,gad^.buffer);
  695.       SetCursor(x+c,y);
  696.       MouseOn;
  697.      END (* IF *);
  698.    END (* CASE *);
  699.   END (* IF *);
  700.  UNTIL (ch=15C);
  701.  
  702.  MouseOff;
  703.  StrText(tdos^.colorGadget,x,y,gad^.width,gad^.buffer);
  704.  tdos^.cursorPos := cursor;
  705.  RestoreCursor;
  706.  MouseOn;
  707. END StrGadgetHandler;
  708.  
  709. PROCEDURE RedrawGadget(gad : GadgetPtr);
  710. VAR win : WindowPtr;
  711.     j,l : CARDINAL;
  712. BEGIN
  713.  IF (gad # NIL) THEN
  714.   MouseOff;
  715.   win := tdos^.firstWindow;
  716.   REPEAT
  717.      IF (gad^.enabled=TRUE) THEN
  718.     j := tdos^.colorGadget;
  719.    ELSE
  720.     j := tdos^.colorGadgetDisabled;
  721.    END (* IF *);
  722.    IF ((gad^.type=strGadget) OR (gad^.type=intGadget)) THEN
  723.     DrawX(j,win^.leftEdge+gad^.leftEdge,win^.topEdge+gad^.topEdge,1,91);
  724.     StrText(j,win^.leftEdge+gad^.leftEdge+1,win^.topEdge+gad^.topEdge,gad^.width,gad^.buffer);
  725.     DrawX(j,win^.leftEdge+gad^.leftEdge+gad^.width-1,win^.topEdge+gad^.topEdge,1,93);
  726.    ELSIF (gad^.type=propGadget) THEN
  727.     gad^.propButton := 0FFFFH;
  728.     DrawProp(gad,j);
  729.    ELSE
  730.     IF (gad^.type=toggleGadget) THEN
  731.      IF (gad^.selected=TRUE) THEN
  732.       gad^.text := "[x]";
  733.      ELSE
  734.       gad^.text := "[ ]";
  735.      END (* IF *);
  736.     END (* IF *);
  737.     l := Length(gad^.text);
  738.     IF (gad^.width=0) THEN
  739.      gad^.width := l-1;
  740.     END (* IF *);
  741.     WriteText(j,win^.leftEdge+gad^.leftEdge,win^.topEdge+gad^.topEdge,ADR(gad^.text));
  742.     IF ((gad^.width+1)>l) THEN
  743.      DrawX(j,win^.leftEdge+gad^.leftEdge+gad^.width,win^.topEdge+gad^.topEdge,(gad^.width+1)-l,32);
  744.     END (* IF *);
  745.    END (* IF *);
  746.    IF (windowSizing IN win^.flags) THEN
  747.     IF NOT ((gad^.type=sizeGadget) OR (gad^.type=depthGadget)) THEN
  748.      IF ((gad^.leftEdge+gad^.width+1)>win^.minWidth) THEN
  749.       win^.minWidth := gad^.leftEdge+gad^.width+1;
  750.      END (* IF *);
  751.      IF (gad^.topEdge+gad^.height>win^.minHeight) THEN
  752.       win^.minHeight := gad^.topEdge+gad^.height+1;
  753.      END (* IF *);
  754.     END (* IF *);
  755.    END (* IF *);
  756.    gad := gad^.nextGadget;
  757.   UNTIL (gad=NIL);
  758.   RestoreCursor;
  759.   MouseOn;
  760.  END (* IF *);
  761. END RedrawGadget;
  762.  
  763. PROCEDURE ShowGadget(gad : GadgetPtr);
  764. VAR g   : GadgetPtr;
  765.     win : WindowPtr;
  766. BEGIN
  767.  win := tdos^.firstWindow;
  768.  IF (win^.firstGadget=NIL) THEN
  769.   win^.firstGadget := gad;
  770.  ELSE
  771.   g := win^.firstGadget;
  772.   WHILE (g^.nextGadget # NIL) DO
  773.    g := g^.nextGadget;
  774.   END (* WHILE *);
  775.   g^.nextGadget := gad;
  776.  END (* IF *);
  777.  RedrawGadget(gad);
  778. END ShowGadget;
  779.  
  780. PROCEDURE ShowHelp(t1,t2 : STRING);
  781. VAR i : CARDINAL;
  782. BEGIN
  783.  DrawX(tdos^.colorHelpBar,0,tdos^.videoMaxY,tdos^.videoWidth-9,32);
  784.  IF (t2 # NIL) THEN
  785.   IF (t1 # NIL) THEN
  786.    i := Length(t1^);
  787.    WriteText(tdos^.colorHelpBar,0,tdos^.videoMaxY,t1);
  788.    IF NOT (Length(t2^)=0) THEN
  789.     DrawX(tdos^.colorHelpBar,i,tdos^.videoMaxY,1,58);
  790.    END (* IF *);
  791.    i := i + 2;
  792.   ELSE
  793.    i := 0;
  794.   END (* IF *);
  795.   WriteText(tdos^.colorHelpBar,i,tdos^.videoMaxY,t2);
  796.  END (* IF *);
  797.  RestoreCursor;
  798. END ShowHelp;
  799.  
  800. PROCEDURE OpenMenu(menu : MenuPtr;
  801.                    ptr  : SysMsgPtr) : CARDINAL;
  802. VAR res  : CARDINAL;
  803.     i,j  : CARDINAL;
  804.  
  805.  PROCEDURE UnSelect;
  806.  BEGIN
  807.   IF NOT (j=0FFFFH) THEN
  808.    MouseOff;
  809.    DrawX(tdos^.colorMenuEnabled,menu^.itemLeftEdge+1,j+2,menu^.itemWidth-2,32);
  810.    WriteText(tdos^.colorMenuEnabled,menu^.itemLeftEdge+2,j+2,ADR(menu^.items[j]));
  811.    IF (checked IN menu^.flags[j]) THEN
  812.     DrawX(tdos^.colorMenuEnabled,menu^.itemLeftEdge+menu^.itemWidth-3,j+2,1,251);
  813.    END (* IF *);
  814.    ShowHelp(ADR(menu^.title),ADR(menu^.info));
  815.    MouseOn;
  816.    j := 0FFFFH;
  817.   END (* IF *);
  818.  END UnSelect;
  819.  
  820. BEGIN
  821.  res := 0;
  822.  MouseOff;
  823.  WriteText(tdos^.colorMenuSelected,menu^.leftEdge,0,ADR(menu^.title));
  824.  CopyVideo2Buffer(tdos^.buffer,menu^.itemLeftEdge,1,menu^.itemWidth,menu^.itemCount+1);
  825.  Fill(tdos^.colorMenuBar,menu^.itemLeftEdge,1,menu^.itemWidth,menu^.itemCount+1,32);
  826.  DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge,1,menu^.itemWidth-1,196);
  827.  DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge,menu^.itemCount+2,menu^.itemWidth-1,196);
  828.  DrawY(tdos^.colorMenuBorder,menu^.itemLeftEdge,1,menu^.itemCount+1,179);
  829.  DrawY(tdos^.colorMenuBorder,menu^.itemLeftEdge+menu^.itemWidth-1,1,menu^.itemCount+1,179);
  830.  DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge,1,1,218);
  831.  DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge+menu^.itemWidth-1,1,1,191);
  832.  DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge,menu^.itemCount+2,1,192);
  833.  DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge+menu^.itemWidth-1,menu^.itemCount+2,1,217);
  834.  FOR i := 0 TO menu^.itemCount-1 DO
  835.   IF NOT (menuBar IN menu^.flags[i]) THEN
  836.    IF NOT (disabled IN menu^.flags[i]) THEN
  837.     j := tdos^.colorMenuEnabled;
  838.    ELSE
  839.     j := tdos^.colorMenuDisabled;
  840.    END (* IF *);
  841.    WriteText(j,menu^.itemLeftEdge+2,i+2,ADR(menu^.items[i]));
  842.    IF (checked IN menu^.flags[i]) THEN
  843.     DrawX(j,menu^.itemLeftEdge+menu^.itemWidth-3,i+2,1,251);
  844.    END (* IF *);
  845.   ELSE
  846.    DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge,i+2,menu^.itemWidth-1,196);
  847.    DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge,i+2,1,195);
  848.    DrawX(tdos^.colorMenuBorder,menu^.itemLeftEdge+menu^.itemWidth-1,i+2,1,180);
  849.   END (* IF *);
  850.  END (* FOR *);
  851.  ShowHelp(ADR(menu^.title),ADR(menu^.info));
  852.  MouseOn;
  853.  
  854.  j := 0FFFFH;
  855.  REPEAT
  856.   GetMouseData;
  857.   IF ((tdos^.mouseY>=2) AND (tdos^.mouseY<=menu^.itemCount+1)) THEN
  858.    IF ((tdos^.mouseX>=menu^.itemLeftEdge) AND (tdos^.mouseX<=(menu^.itemLeftEdge+menu^.itemWidth-1))) THEN
  859.     i := tdos^.mouseY-2;
  860.     IF NOT (i=j) THEN
  861.      IF NOT ((disabled IN menu^.flags[i]) OR (menuBar IN menu^.flags[i])) THEN
  862.       UnSelect;
  863.       MouseOff;
  864.       DrawX(tdos^.colorMenuSelected,menu^.itemLeftEdge+1,i+2,menu^.itemWidth-2,32);
  865.       WriteText(tdos^.colorMenuSelected,menu^.itemLeftEdge+2,i+2,ADR(menu^.items[i]));
  866.       ShowHelp(ADR(menu^.items[i]),ADR(menu^.help[i]));
  867.       IF (checked IN menu^.flags[i]) THEN
  868.        DrawX(tdos^.colorMenuSelected,menu^.itemLeftEdge+menu^.itemWidth-3,i+2,1,251);
  869.       END (* IF *);
  870.       MouseOn;
  871.       j := i;
  872.      ELSE
  873.       UnSelect;
  874.      END (* IF *);
  875.     END (* IF *);
  876.    ELSE
  877.     UnSelect;
  878.    END (* IF *);
  879.   ELSE
  880.    UnSelect;
  881.    IF (tdos^.mouseY<2) THEN
  882.     IF NOT ((tdos^.mouseX>=menu^.leftEdge) AND (tdos^.mouseX<=(menu^.leftEdge+Length(menu^.title)))) THEN
  883.      res := 1;
  884.     END (* IF *);
  885.    END (* IF *);
  886.   END (* IF *);
  887.  UNTIL NOT ((left IN tdos^.mouseButtons) AND (res=0));
  888.  
  889.  MouseOff;
  890.  CopyBuffer2Video(tdos^.buffer,menu^.itemLeftEdge,1,menu^.itemWidth,menu^.itemCount+1);
  891.  WriteText(tdos^.colorMenuBar,menu^.leftEdge,0,ADR(menu^.title));
  892.  ShowHelp(NIL,NIL);
  893.  RestoreCursor;
  894.  MouseOn;
  895.  IF ((j<>0FFFFH) AND (res=0)) THEN
  896.   ptr^.itemNum := j;
  897.   res := 2;
  898.   IF (checkit IN menu^.flags[j]) THEN
  899.    IF (checked IN menu^.flags[j]) THEN
  900.     menu^.flags[j] := menu^.flags[j] - ItemFlagSet{checked};
  901.    ELSE
  902.     menu^.flags[j] := menu^.flags[j] + ItemFlagSet{checked};
  903.    END (* IF *);
  904.   END (* IF *);
  905.  END (* IF *);
  906.  RETURN(res);
  907. END OpenMenu;
  908.  
  909. PROCEDURE GetChar(x,y : CARDINAL) : CARDINAL;
  910. VAR c,seg,ofs : CARDINAL;
  911. BEGIN
  912.  seg := 0B800H;
  913.  ofs := (y*tdos^.videoBPR)+(x*2);
  914.  ASM
  915.   MOV ES,seg
  916.   MOV DI,ofs
  917.   MOV AL,ES:[DI]
  918.   MOV AH,ES:[DI+1]
  919.   MOV c,AX
  920.  END (* ASM *);
  921.  RETURN(c);
  922. END GetChar;
  923.  
  924. PROCEDURE PutChar(x,y,c : CARDINAL);
  925. VAR seg,ofs : CARDINAL;
  926. BEGIN
  927.  seg := 0B800H;
  928.  ofs := (y*tdos^.videoBPR)+(x*2);
  929.  ASM
  930.   MOV ES,seg
  931.   MOV DI,ofs
  932.   MOV AX,c
  933.   MOV ES:[DI],AL
  934.   MOV ES:[DI+1],AH
  935.  END (* ASM *);
  936. END PutChar;
  937.  
  938. PROCEDURE SizeWindow(nw,nh : CARDINAL);
  939. VAR win : WindowPtr;
  940. BEGIN
  941.  win := tdos^.firstWindow;
  942.  IF NOT ((nw=win^.width) AND (nh=win^.height)) THEN
  943.   MouseOff;
  944.   Fill(tdos^.colorScreenBackgrnd,win^.leftEdge,win^.topEdge,win^.width,win^.height,tdos^.patternScreenBackgrnd);
  945.   win^.width  := nw;
  946.   win^.height := nh;
  947.   Fill(tdos^.colorWindowBackgrnd,win^.leftEdge,win^.topEdge,win^.width,win^.height,tdos^.patternWindowBackgrnd);
  948.   DrawWindowBorder(win,TRUE);
  949.   win^.sysGadgets[1].leftEdge := win^.width-4;
  950.   win^.sysGadgets[2].leftEdge := win^.width-1;
  951.   win^.sysGadgets[2].topEdge  := win^.height;
  952.   CopyVideo2Buffer(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  953.   RestoreWindows(win);
  954.   win^.cursorPos := 05050H;
  955.   tdos^.cursorPos := 05050H;
  956.   RedrawGadget(win^.firstGadget);
  957.   RestoreCursor;
  958.   MouseOn;
  959.  END (* IF *);
  960. END SizeWindow;
  961.  
  962. PROCEDURE WinSize;
  963. VAR win    : WindowPtr;
  964.     bx,by,
  965.     ox,oy,
  966.     c1,c2,
  967.     c3,c4,
  968.     min    : CARDINAL;
  969.  
  970.  PROCEDURE RemIt;
  971.  BEGIN
  972.   IF NOT (ox=0FFFFH) THEN
  973.    PutChar(ox,oy,c1);
  974.    PutChar(win^.leftEdge,win^.topEdge,c2);
  975.    PutChar(ox,win^.topEdge,c3);
  976.    PutChar(win^.leftEdge,oy,c4);
  977.   END (* IF *);
  978.  END RemIt;
  979.  
  980.  PROCEDURE DrawIt;
  981.  BEGIN
  982.   RemIt;
  983.   ox := bx;
  984.   oy := by;
  985.   c1 := GetChar(bx,by);
  986.   c2 := GetChar(win^.leftEdge,win^.topEdge);
  987.   c3 := GetChar(bx,win^.topEdge);
  988.   c4 := GetChar(win^.leftEdge,by);
  989.   DrawX(tdos^.colorMove,bx,by,1,29);
  990.   DrawX(tdos^.colorMove,win^.leftEdge,win^.topEdge,1,29);
  991.   DrawX(tdos^.colorMove,bx,win^.topEdge,1,29);
  992.   DrawX(tdos^.colorMove,win^.leftEdge,by,1,29);
  993.  END DrawIt;
  994.  
  995. BEGIN
  996.  win := tdos^.firstWindow;
  997.  IF (windowSizing IN win^.flags) THEN
  998.   bx := win^.leftEdge+win^.width-1;
  999.   by := win^.topEdge+win^.height;
  1000.   ox := 0FFFFH;
  1001.   oy := 0FFFFH;
  1002.   min := Length(win^.title)+10;
  1003.   MouseOff;
  1004.   tdos^.help := "Ziehen Sie das Fenster mit der Maus auf die gewünschte Größe.";
  1005.   ShowHelp(NIL,ADR(tdos^.help));
  1006.   DrawIt;
  1007.   REPEAT
  1008.    GetMouseData;
  1009.    bx := tdos^.mouseX;
  1010.    by := tdos^.mouseY;
  1011.    IF (bx<(win^.leftEdge+min)) THEN
  1012.     bx := win^.leftEdge+min;
  1013.    END (* IF *);
  1014.    IF (by>(tdos^.videoMaxY-1)) THEN
  1015.     by := tdos^.videoMaxY-1;
  1016.    END (* IF *);
  1017.    IF (by<win^.topEdge+1) THEN
  1018.     by := win^.topEdge+1;
  1019.    END (* IF *);
  1020.    IF (bx<(win^.leftEdge+win^.minWidth)) THEN
  1021.     bx := win^.leftEdge+win^.minWidth;
  1022.    END (* IF *);
  1023.    IF (by<(win^.topEdge+win^.minHeight)) THEN
  1024.     by := win^.topEdge+win^.minHeight;
  1025.    END (* IF *);
  1026.    IF NOT ((ox=bx) AND (oy=by)) THEN
  1027.     DrawIt;
  1028.    END (* IF *);
  1029.   UNTIL NOT (left IN tdos^.mouseButtons);
  1030.   RemIt;
  1031.   IF NOT (mid IN tdos^.mouseButtons) THEN
  1032.    SizeWindow(bx-(win^.leftEdge-1),by-win^.topEdge);
  1033.   ELSE
  1034.    REPEAT
  1035.     GetMouseData;
  1036.    UNTIL NOT (mid IN tdos^.mouseButtons);
  1037.   END (* IF *);
  1038.   ShowHelp(NIL,NIL);
  1039.   RestoreCursor;
  1040.   MouseOn;
  1041.  END (* IF *);
  1042. END WinSize;
  1043.  
  1044. PROCEDURE MoveWindow(x,y : CARDINAL);
  1045. VAR win : WindowPtr;
  1046. BEGIN
  1047.  win := tdos^.firstWindow;
  1048.  IF NOT ((x=win^.leftEdge) AND (y=win^.topEdge)) THEN
  1049.   MouseOff;
  1050.   CopyVideo2Buffer(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  1051.   Fill(tdos^.colorScreenBackgrnd,win^.leftEdge,win^.topEdge,win^.width,win^.height,tdos^.patternScreenBackgrnd);
  1052.   win^.leftEdge := x;
  1053.   win^.topEdge := y+1;
  1054.   RestoreWindows(win);
  1055.   tdos^.cursorPos := win^.cursorPos+(win^.topEdge*256)+win^.leftEdge;
  1056.   RestoreCursor;
  1057.   MouseOn;
  1058.  END (* IF *);
  1059. END MoveWindow;
  1060.  
  1061. PROCEDURE WinMove;
  1062. VAR win    : WindowPtr;
  1063.     bx,by,
  1064.     ox,oy,
  1065.     c1,c2,
  1066.     c3,c4  : CARDINAL;
  1067.  
  1068.  PROCEDURE RemIt;
  1069.  BEGIN
  1070.  IF NOT (ox=0FFFFH) THEN
  1071.    PutChar(ox,oy,c1);
  1072.    PutChar(ox+win^.width-1,oy,c2);
  1073.    PutChar(ox+win^.width-1,oy+win^.height,c3);
  1074.    PutChar(ox,oy+win^.height,c4);
  1075.   END (* IF *);
  1076.  END RemIt;
  1077.  
  1078.  PROCEDURE DrawIt;
  1079.  BEGIN
  1080.   RemIt;
  1081.   ox := bx;
  1082.   oy := by;
  1083.   c1 := GetChar(bx,by);
  1084.   c2 := GetChar(bx+win^.width-1,by);
  1085.   c3 := GetChar(bx+win^.width-1,by+win^.height);
  1086.   c4 := GetChar(bx,by+win^.height);
  1087.   DrawX(tdos^.colorMove,bx,by,1,17);
  1088.   DrawX(tdos^.colorMove,bx+win^.width-1,by,1,16);
  1089.   DrawX(tdos^.colorMove,bx+win^.width-1,by+win^.height,1,16);
  1090.   DrawX(tdos^.colorMove,bx,by+win^.height,1,17);
  1091.  END DrawIt;
  1092.  
  1093. BEGIN
  1094.  win := tdos^.firstWindow;
  1095.  
  1096.  MouseOff;
  1097.  CopyVideo2Buffer(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  1098.  tdos^.help := "Verschieben Sie das Fenster mit der Maus in die gewünschte Position.";
  1099.  ShowHelp(NIL,ADR(tdos^.help));
  1100.  
  1101.  bx := win^.leftEdge;
  1102.  by := win^.topEdge;
  1103.  ox := 0FFFFH;
  1104.  oy := 0FFFFH;
  1105.  
  1106.  AX := 4;
  1107.  CX := win^.leftEdge * 8;
  1108.  DX := win^.topEdge * 8;
  1109.  Trap(033H);
  1110.  
  1111.  DrawIt;
  1112.  REPEAT
  1113.   GetMouseData;
  1114.   bx := tdos^.mouseX;
  1115.   by := tdos^.mouseY;
  1116.   IF (by<1) THEN
  1117.    by := 1;
  1118.   END (* IF *);
  1119.   IF (by+win^.height)>(tdos^.videoMaxY-1) THEN
  1120.    by := tdos^.videoMaxY-win^.height-1;
  1121.   END (* IF *);
  1122.   IF (bx+win^.width)>tdos^.videoWidth THEN
  1123.    bx := tdos^.videoWidth-win^.width;
  1124.   END (* IF *);
  1125.   IF NOT ((ox=bx) AND (oy=by)) THEN
  1126.    DrawIt;
  1127.   END (* IF *);
  1128.  UNTIL NOT (right IN tdos^.mouseButtons);
  1129.  RemIt;
  1130.  IF NOT (mid IN tdos^.mouseButtons) THEN
  1131.   MoveWindow(bx,by-1);
  1132.  ELSE
  1133.   REPEAT
  1134.    GetMouseData;
  1135.   UNTIL NOT (mid IN tdos^.mouseButtons);
  1136.  END (* IF *);
  1137.  ShowHelp(NIL,NIL);
  1138.  RestoreCursor;
  1139.  MouseOn;
  1140. END WinMove;
  1141.  
  1142. PROCEDURE ShowClock;
  1143. VAR time  : Time;
  1144.     h,m,s : CARDINAL;
  1145.     text  : ARRAY [0..3] OF CHAR;
  1146.  
  1147.  PROCEDURE Out(x,num : CARDINAL;
  1148.                bool  : BOOLEAN);
  1149.  BEGIN
  1150.   NumToString(num,10,text,1);
  1151.   IF (Length(text)<2) THEN
  1152.    DrawX(tdos^.colorHelpBar,tdos^.videoMaxX-x,tdos^.videoMaxY,1,48);
  1153.    WriteText(tdos^.colorHelpBar,tdos^.videoMaxX-x+1,tdos^.videoMaxY,ADR(text));
  1154.   ELSE
  1155.    WriteText(tdos^.colorHelpBar,tdos^.videoMaxX-x,tdos^.videoMaxY,ADR(text));
  1156.   END (* IF *);
  1157.   IF (bool=TRUE) THEN
  1158.    DrawX(tdos^.colorHelpBar,tdos^.videoMaxX-x+2,tdos^.videoMaxY,1,58);
  1159.   END (* IF *);
  1160.  END Out;
  1161.  
  1162. BEGIN
  1163.  GetTime(time);
  1164.  h := time.minute DIV 60;
  1165.  m := time.minute MOD 60;
  1166.  s := time.millisec DIV 1000;
  1167.  Out(8,h,TRUE);
  1168.  Out(5,m,TRUE);
  1169.  Out(2,s,FALSE);
  1170.  RestoreCursor;
  1171. END ShowClock;
  1172.  
  1173. PROCEDURE ModifyProp(gad     : GadgetPtr;
  1174.                      pos,max : CARDINAL);
  1175. BEGIN
  1176.  IF (pos>max) THEN pos := max; END;
  1177.  gad^.propMax := max;
  1178.  gad^.propPos := pos;
  1179.  RedrawGadget(gad);
  1180. END ModifyProp;
  1181.  
  1182. PROCEDURE LineH(x,y,l : CARDINAL);
  1183. VAR win : WindowPtr;
  1184.     c   : CARDINAL;
  1185. BEGIN
  1186.  win := tdos^.firstWindow;
  1187.  x := x + win^.leftEdge;
  1188.  y := y + win^.topEdge;
  1189.  c   := win^.frontPen+(win^.backPen*16);
  1190.  MouseOff;
  1191.  DrawX(c,x,y,1,195);
  1192.  DrawX(c,x+1,y,l-2,196);
  1193.  DrawX(c,x+l-1,y,1,180);
  1194.  RestoreCursor;
  1195.  MouseOn;
  1196. END LineH;
  1197.  
  1198. PROCEDURE LineV(x,y,l : CARDINAL);
  1199. VAR win : WindowPtr;
  1200.     c   : CARDINAL;
  1201. BEGIN
  1202.  win := tdos^.firstWindow;
  1203.  x   := x + win^.leftEdge;
  1204.  y   := y + win^.topEdge;
  1205.  c   := win^.frontPen+(win^.backPen*16);
  1206.  MouseOff;
  1207.  DrawX(c,x,y,1,195);
  1208.  DrawY(c,x,y+1,l-2,196);
  1209.  DrawX(c,x,y+l-1,1,180);
  1210.  RestoreCursor;
  1211.  MouseOn;
  1212. END LineV;
  1213.  
  1214. PROCEDURE Char(x,y,c : CARDINAL);
  1215. VAR win : WindowPtr;
  1216. BEGIN
  1217.  win := tdos^.firstWindow;
  1218.  MouseOff;
  1219.  DrawX(win^.frontPen+(win^.backPen*16),x+win^.leftEdge,y+win^.topEdge,1,c);
  1220.  RestoreCursor;
  1221.  MouseOn;
  1222. END Char;
  1223.  
  1224. PROCEDURE Box(x,y,w,h : CARDINAL);
  1225. VAR win : WindowPtr;
  1226.     c   : CARDINAL;
  1227. BEGIN
  1228.  win := tdos^.firstWindow;
  1229.  x   := x + win^.leftEdge;
  1230.  y   := y + win^.topEdge;
  1231.  c   := win^.frontPen+(win^.backPen*16);
  1232.  MouseOff;
  1233.  DrawX(c,x+1,y,w-1,196);
  1234.  DrawX(c,x+1,y+h-1,w-2,196);
  1235.  DrawY(c,x,y+1,h-2,179);
  1236.  DrawY(c,x+w-1,y+1,h-2,179);
  1237.  DrawX(c,x,y,1,218);
  1238.  DrawX(c,x+w-1,y,1,191);
  1239.  DrawX(c,x+w-1,y+h-1,1,217);
  1240.  DrawX(c,x,y+h-1,1,192);
  1241.  RestoreCursor;
  1242.  MouseOn;
  1243. END Box;
  1244.  
  1245. PROCEDURE DrawProp(gad : GadgetPtr; farbe : CARDINAL);
  1246. VAR win : WindowPtr;
  1247.     x,y : CARDINAL;
  1248.     old : CARDINAL;
  1249. BEGIN
  1250.  win := tdos^.firstWindow;
  1251.  x   := win^.leftEdge+gad^.leftEdge;
  1252.  y   := win^.topEdge+gad^.topEdge;
  1253.  old := gad^.propButton;
  1254.  IF (gad^.propV=TRUE) THEN
  1255.   gad^.propAdd := gad^.propMax DIV (gad^.height-3);
  1256.   gad^.propButton := gad^.propPos DIV gad^.propAdd;
  1257.   IF (gad^.propButton>(gad^.height-3)) THEN
  1258.    gad^.propButton := gad^.height - 3;
  1259.   END (* IF *);
  1260.   IF NOT (old=gad^.propButton) THEN
  1261.    MouseOff;
  1262.    DrawX(farbe,x,y,1,24);
  1263.    DrawY(farbe,x,y+1,gad^.height-3,176);
  1264.    DrawX(farbe,x,y+gad^.height-1,1,25);
  1265.    DrawX(15,x,y+1+gad^.propButton,1,219);
  1266.    MouseOn;
  1267.    RestoreCursor;
  1268.   END (* IF *);
  1269.  ELSE
  1270.   gad^.propAdd    := gad^.propMax DIV (gad^.width-3);
  1271.   gad^.propButton := gad^.propPos DIV gad^.propAdd;
  1272.   IF (gad^.propButton>(gad^.width-3)) THEN
  1273.    gad^.propButton := gad^.width - 3;
  1274.   END (* IF *);
  1275.   IF NOT (old=gad^.propButton) THEN
  1276.    MouseOff;
  1277.    DrawX(farbe,x,y,1,27);
  1278.    DrawX(farbe,x+1,y,gad^.width-2,176);
  1279.    DrawX(farbe,x+gad^.width-1,y,1,26);
  1280.    DrawX(15,x+1+gad^.propButton,y,1,219);
  1281.    MouseOn;
  1282.    RestoreCursor;
  1283.   END (* IF *);
  1284.  END (* IF *);
  1285. END DrawProp;
  1286.  
  1287. PROCEDURE PropGadgetHandler(gad : GadgetPtr;
  1288.                             ptr : SysMsgPtr);
  1289. VAR win : WindowPtr;
  1290.     x,y : CARDINAL;
  1291. BEGIN
  1292.  win := tdos^.firstWindow;
  1293.  x   := win^.leftEdge+gad^.leftEdge;
  1294.  y   := win^.topEdge+gad^.topEdge;
  1295.  IF (gad^.propV=TRUE) THEN
  1296.   IF (tdos^.mouseY=(y+gad^.height-1)) THEN
  1297.    IF (gad^.propPos<gad^.propMax) THEN
  1298.     gad^.propPos := gad^.propPos + 1;
  1299.    END (* IF *);
  1300.   ELSIF (tdos^.mouseY=y) THEN
  1301.    IF (gad^.propPos>0) THEN
  1302.     gad^.propPos := gad^.propPos - 1;
  1303.    END (* IF *);
  1304.   ELSIF (tdos^.mouseY=(y+1+gad^.propButton)) THEN
  1305.    REPEAT
  1306.     GetMouseData;
  1307.     IF (tdos^.mouseY<=y) THEN
  1308.      gad^.propPos := 0;
  1309.     ELSIF (tdos^.mouseY>(y+gad^.height)) THEN
  1310.      gad^.propPos := gad^.propMax;
  1311.     ELSE
  1312.      gad^.propPos := (tdos^.mouseY-y-1)*gad^.propAdd;
  1313.     END (* IF *);
  1314.     DrawProp(gad,colorGadget);
  1315.    UNTIL NOT (left IN tdos^.mouseButtons);
  1316.   ELSE
  1317.    gad^.propPos := (tdos^.mouseY-y-1)*gad^.propAdd;
  1318.   END (* IF *);
  1319.  ELSE
  1320.   IF (tdos^.mouseX=x+gad^.width-1) THEN
  1321.    IF (gad^.propPos<gad^.propMax) THEN
  1322.     gad^.propPos := gad^.propPos + 1;
  1323.    END (* IF *);
  1324.   ELSIF (tdos^.mouseX=x) THEN
  1325.    IF (gad^.propPos>0) THEN
  1326.     gad^.propPos := gad^.propPos - 1;
  1327.    END (* IF *);
  1328.   ELSIF (tdos^.mouseX=(x+1+gad^.propButton)) THEN
  1329.    REPEAT
  1330.     GetMouseData;
  1331.     IF (tdos^.mouseX<=x) THEN
  1332.      gad^.propPos := 0;
  1333.     ELSIF (tdos^.mouseX>(x+gad^.width)) THEN
  1334.      gad^.propPos := gad^.propMax;
  1335.     ELSE
  1336.      gad^.propPos := (tdos^.mouseX-x-1)*gad^.propAdd;
  1337.     END (* IF *);
  1338.     DrawProp(gad,colorGadget);
  1339.    UNTIL NOT (left IN tdos^.mouseButtons);
  1340.   ELSE
  1341.    gad^.propPos := (tdos^.mouseX-x-1)*gad^.propAdd;
  1342.   END (* IF *);
  1343.  END (* IF *);
  1344.  MouseOff;
  1345.  DrawProp(gad,colorGadget);
  1346.  MouseOn;
  1347.  RestoreCursor;
  1348. END PropGadgetHandler;
  1349.  
  1350. PROCEDURE SystemManager;
  1351. VAR ptr    : SysMsgPtr;
  1352.     win,w2 : WindowPtr;
  1353.     gad,g2 : GadgetPtr;
  1354.     menu   : MenuPtr;
  1355.     i,j,k  : CARDINAL;
  1356.     ok     : BOOLEAN;
  1357.     bool   : BOOLEAN;
  1358. BEGIN
  1359.  ok := FALSE;
  1360.  REPEAT
  1361.   ptr := ADR(tdos^.message);
  1362.   REPEAT
  1363.    IF (timerUpdate=TRUE) THEN
  1364.     timerUpdate := FALSE;
  1365.     ShowClock;
  1366.    END (* IF *);
  1367.    GetMouseData;
  1368.    AX := 0100H;
  1369.    Trap(016H);
  1370.   UNTIL ((left IN tdos^.mouseButtons) OR (right IN tdos^.mouseButtons) OR (mid IN tdos^.mouseButtons) OR (NOT (zeroFlag IN FLAGS)));
  1371.  
  1372.   IF NOT (zeroFlag IN FLAGS) THEN
  1373.    AX := 0;
  1374.    Trap(016H);
  1375.    i := AX;
  1376.    IF (tdos^.firstWindow # NIL) THEN
  1377.     ok := TRUE;
  1378.     ptr^.window   := tdos^.firstWindow;
  1379.     ptr^.code     := (i MOD 256);
  1380.     ptr^.scancode := (i DIV 256);
  1381.     ptr^.class    := SysMsgClassSet{keyboard};
  1382.    END (* IF *);
  1383.   ELSE
  1384.    win := tdos^.firstWindow;
  1385.    IF (win # NIL) THEN
  1386.     bool := FALSE;
  1387.     w2   := NIL;
  1388.     REPEAT
  1389.     IF (tdos^.mouseX>=win^.leftEdge) THEN
  1390.      IF (tdos^.mouseY>=win^.topEdge) THEN
  1391.       IF (tdos^.mouseX<=(win^.leftEdge+win^.width-1)) THEN
  1392.        IF (tdos^.mouseY<=(win^.topEdge+win^.height)) THEN
  1393.         w2 := win;
  1394.         bool := TRUE;
  1395.        END (* IF *);
  1396.       END (* IF *);
  1397.      END (* IF *);
  1398.     END (* IF *);
  1399.     IF (bool=FALSE) THEN
  1400.      win := win^.nextWindow;
  1401.      IF (win=NIL) THEN
  1402.       bool := TRUE;
  1403.      END (* IF *);
  1404.     END (* IF *);
  1405.     UNTIL (bool=TRUE);
  1406.     IF (left IN tdos^.mouseButtons) THEN
  1407.      IF (w2 # NIL) THEN
  1408.       win := w2;
  1409.       ptr^.window := win;
  1410.       IF NOT (win=tdos^.firstWindow) THEN
  1411.        REPEAT
  1412.         GetMouseData;
  1413.        UNTIL NOT (left IN tdos^.mouseButtons);
  1414.        IF (tdos^.mouseX>=win^.leftEdge) THEN
  1415.         IF (tdos^.mouseY>=win^.topEdge) THEN
  1416.          IF (tdos^.mouseX<=(win^.leftEdge+win^.width-1)) THEN
  1417.           IF (tdos^.mouseY<=(win^.topEdge+win^.height)) THEN
  1418.            ok := TRUE;
  1419.            ptr^.class  := SysMsgClassSet{activateWindow};
  1420.            ActivateWindow(win);
  1421.           END (* IF *);
  1422.          END (* IF *);
  1423.         END (* IF *);
  1424.        END (* IF *);
  1425.       ELSE
  1426.        gad := win^.firstGadget;
  1427.        g2 := NIL;
  1428.        WHILE (gad # NIL) DO
  1429.         IF (tdos^.mouseX>=(win^.leftEdge+gad^.leftEdge)) THEN
  1430.          IF (tdos^.mouseY>=(win^.topEdge+gad^.topEdge)) THEN
  1431.           IF (tdos^.mouseX<=(win^.leftEdge+gad^.leftEdge+gad^.width)) THEN
  1432.            IF (tdos^.mouseY<(win^.topEdge+gad^.topEdge+gad^.height)) THEN
  1433.             IF (gad^.enabled=TRUE) THEN
  1434.              g2 := gad;
  1435.              gad := NIL;
  1436.             END (* IF *);
  1437.            END (* IF *);
  1438.           END (* IF *);
  1439.          END (* IF *);
  1440.         END (* IF *);
  1441.         IF (gad # NIL) THEN gad := gad^.nextGadget; END;
  1442.        END (* WHILE *);
  1443.        IF (g2 # NIL) THEN
  1444.         IF (g2^.type=sizeGadget) THEN
  1445.          ok := TRUE;
  1446.          ptr^.class := SysMsgClassSet{sizeWindow};
  1447.          ShowHelp(NIL,ADR(g2^.help));
  1448.          WinSize;
  1449.         ELSIF (g2^.type=propGadget) THEN
  1450.          PropGadgetHandler(g2,ptr);
  1451.         ELSE
  1452.          MouseOff;
  1453.          WriteText(tdos^.colorGadgetSelected,win^.leftEdge+g2^.leftEdge,win^.topEdge+g2^.topEdge,ADR(g2^.text));
  1454.          MouseOn;
  1455.          ShowHelp(NIL,ADR(g2^.help));
  1456.          REPEAT
  1457.           GetMouseData;
  1458.          UNTIL NOT (left IN tdos^.mouseButtons);
  1459.          MouseOff;
  1460.          WriteText(tdos^.colorGadget,win^.leftEdge+g2^.leftEdge,win^.topEdge+g2^.topEdge,ADR(g2^.text));
  1461.          MouseOn;
  1462.          IF (tdos^.mouseX>=(win^.leftEdge+g2^.leftEdge)) THEN
  1463.           IF (tdos^.mouseY>=(win^.topEdge+g2^.topEdge)) THEN
  1464.            IF (tdos^.mouseX<=(win^.leftEdge+g2^.leftEdge+g2^.width)) THEN
  1465.             IF (tdos^.mouseY<(win^.topEdge+g2^.topEdge+g2^.height)) THEN
  1466.              ok := TRUE;
  1467.              CASE g2^.type OF
  1468.               boolGadget:
  1469.                ptr^.gadget   := g2;
  1470.                ptr^.gadgetID := g2^.id;
  1471.                ptr^.class    := SysMsgClassSet{gadgetUp};|
  1472.               toggleGadget:
  1473.                ptr^.gadget   := g2;
  1474.                ptr^.gadgetID := g2^.id;
  1475.                ptr^.class    := SysMsgClassSet{gadgetUp};
  1476.                IF (g2^.selected=TRUE) THEN
  1477.                 g2^.text     := "[ ]";
  1478.                 g2^.selected := FALSE;
  1479.                ELSE
  1480.                 g2^.text     := "[x]";
  1481.                 g2^.selected := TRUE;
  1482.                END (* IF *);
  1483.                MouseOff;
  1484.                WriteText(tdos^.colorGadget,win^.leftEdge+g2^.leftEdge,win^.topEdge+g2^.topEdge,ADR(g2^.text));
  1485.                MouseOn;|
  1486.               strGadget:
  1487.                ptr^.gadget   := g2;
  1488.                ptr^.gadgetID := g2^.id;
  1489.                ptr^.class    := SysMsgClassSet{gadgetUp};
  1490.                StrGadgetHandler(g2);|
  1491.               closeGadget:
  1492.                ptr^.class := SysMsgClassSet{closeWindow};|
  1493.               depthGadget:
  1494.                IF (win^.nextWindow # NIL) THEN
  1495.                 w2 := win;
  1496.                 WHILE (w2^.nextWindow # NIL) DO
  1497.                  w2 := w2^.nextWindow;
  1498.                 END (* WHILE *);
  1499.                 ptr^.class  := SysMsgClassSet{activateWindow};
  1500.                 ptr^.window := w2;
  1501.                 ActivateWindow(w2);
  1502.                ELSE
  1503.                 ok := FALSE;
  1504.                END (* IF *);
  1505.              END (* CASE *);
  1506.             END (* IF *);
  1507.            END (* IF *);
  1508.           END (* IF *);
  1509.          END (* IF *);
  1510.          ShowHelp(NIL,NIL);
  1511.         END (* IF *);
  1512.        END (* IF *);
  1513.       END (* IF *);
  1514.      ELSE
  1515.       REPEAT
  1516.        GetMouseData;
  1517.        k := 0;
  1518.        IF ((left IN tdos^.mouseButtons) AND (tdos^.mouseY=0)) THEN
  1519.         win  := tdos^.firstWindow;
  1520.         menu := win^.firstMenu;
  1521.         bool := FALSE;
  1522.         i := 0;
  1523.         WHILE ((menu # NIL) AND (bool=FALSE)) DO
  1524.          IF ((tdos^.mouseX>=menu^.leftEdge) AND (tdos^.mouseX<=(menu^.leftEdge+Length(menu^.title)))) THEN
  1525.           bool := TRUE;
  1526.          ELSE
  1527.           menu := menu^.nextMenu;
  1528.           i := i + 1;
  1529.          END (* IF *);
  1530.         END (* WHILE *);
  1531.         IF (bool=TRUE) THEN
  1532.          ptr^.class   := SysMsgClassSet{menuPick};
  1533.          ptr^.menuNum := i;
  1534.          k := OpenMenu(menu,ptr);
  1535.          IF (k=2) THEN
  1536.           ok := TRUE;
  1537.          END (* IF *);
  1538.         END (* IF *);
  1539.        END (* IF *);
  1540.       UNTIL NOT ((k=1) OR (left IN tdos^.mouseButtons));
  1541.      END (* IF *);
  1542.     ELSIF (right IN tdos^.mouseButtons) THEN
  1543.      win := tdos^.firstWindow;
  1544.      IF (windowDrag IN win^.flags) THEN
  1545.       IF NOT (requester IN win^.flags) THEN
  1546.        ptr^.window := win;
  1547.        ptr^.class  := SysMsgClassSet{moveWindow};
  1548.        WinMove;
  1549.       END (* IF *);
  1550.      END (* IF *);
  1551.     ELSIF (mid IN tdos^.mouseButtons) THEN
  1552.      win := tdos^.firstWindow;
  1553.      IF (((windowSizing IN win^.flags) AND (windowDrag IN win^.flags)) AND NOT (requester IN win^.flags)) THEN
  1554.       IF NOT ((win^.leftEdge=0) AND (win^.topEdge=1) AND (win^.width=tdos^.videoWidth) AND (win^.height=tdos^.videoMaxY-2) AND (win^.maxWindow=FALSE)) THEN
  1555.        win := tdos^.firstWindow;
  1556.        ptr^.window := win;
  1557.        ptr^.class  := SysMsgClassSet{moveWindow,sizeWindow};
  1558.        IF (win^.maxWindow=FALSE) THEN
  1559.         win^.maxWindow := TRUE;
  1560.         win^.maxW := win^.width;
  1561.         win^.maxH := win^.height;
  1562.         win^.maxX := win^.leftEdge;
  1563.         win^.maxY := win^.topEdge-1;
  1564.         MoveWindow(0,0);
  1565.         SizeWindow(tdos^.videoWidth,tdos^.videoMaxY-2);
  1566.        ELSE
  1567.         win^.maxWindow := FALSE;
  1568.         SizeWindow(win^.maxW,win^.maxH);
  1569.         MoveWindow(win^.maxX,win^.maxY);
  1570.        END (* IF *);
  1571.        REPEAT
  1572.         GetMouseData;
  1573.        UNTIL NOT (mid IN tdos^.mouseButtons);
  1574.       END (* IF *);
  1575.      END (* IF *);
  1576.     END (* IF *);
  1577.    ELSE
  1578.     ok := TRUE;
  1579.     ptr^.class := SysMsgClassSet{noWindow};
  1580.    END (* IF *);
  1581.   END (* IF *);
  1582.  UNTIL (ok=TRUE);
  1583. END SystemManager;
  1584.  
  1585. PROCEDURE WaitForKey;
  1586. BEGIN
  1587.  AX := 0;
  1588.  Trap(016H);
  1589. END WaitForKey;
  1590.  
  1591. PROCEDURE OpenScreen(new : BOOLEAN);
  1592. BEGIN
  1593.  IF (new=TRUE) THEN
  1594.   tdos^.cursorPos   := 05050H;
  1595.   tdos^.firstWindow := NIL;
  1596.   tdos^.mouseLock   := 0;
  1597.   tdos^.videoBPR    := tdos^.videoWidth*2;
  1598.   tdos^.videoMaxX   := tdos^.videoWidth-1;
  1599.   tdos^.videoMaxY   := tdos^.videoHeight-1;
  1600.   tdos^.videoSize   := (tdos^.videoBPR*tdos^.videoHeight);
  1601.  END (* IF *);
  1602.  AX := tdos^.videoMode;
  1603.  Trap(010H);
  1604.  MouseReset;
  1605.  MouseLimits(0,0,tdos^.videoMaxX,tdos^.videoMaxY-1);
  1606.  Fill(tdos^.colorScreenBackgrnd,0,1,tdos^.videoWidth,tdos^.videoHeight-2,tdos^.patternScreenBackgrnd);
  1607.  DrawX(tdos^.colorMenuBar,0,0,tdos^.videoWidth,32);
  1608.  DrawX(tdos^.colorHelpBar,0,tdos^.videoMaxY,tdos^.videoWidth,32);
  1609.  IF (new=TRUE) THEN
  1610.   tdos^.help := welcome;
  1611.   ShowHelp(NIL,ADR(tdos^.help));
  1612.  END (* IF *);
  1613.  IF (tdos^.firstWindow # NIL) THEN
  1614.   ShowMenuStrip(tdos^.firstWindow);
  1615.  END (* IF *);
  1616.  ShowClock;
  1617.  MouseOn;
  1618.  tdos^.active := TRUE;
  1619. END OpenScreen;
  1620.  
  1621. PROCEDURE CloseScreen;
  1622. BEGIN
  1623.  MouseOff;
  1624.  AX := 3;
  1625.  Trap(010H);
  1626.  tdos^.active := FALSE;
  1627. END CloseScreen;
  1628.  
  1629. PROCEDURE GraphicsLibrary(cmd       : CARDINAL;
  1630.                           a,b,c,d,e : CARDINAL;
  1631.                           seg,ofs   : CARDINAL);
  1632. VAR ptr : ADDRESS;
  1633. BEGIN
  1634.  ptr.SEG := seg;
  1635.  ptr.OFS := ofs;
  1636.  MouseOff;
  1637.  CASE cmd OF
  1638.   0:
  1639.    WriteText(a,b,c,ptr);|
  1640.   1:
  1641.    Fill(a,b,c,d,e,ofs);|
  1642.   2:
  1643.    SetCursor(a,b);|
  1644.   3:
  1645.    RestoreCursor;|
  1646.   4:
  1647.    CopyVideo2Buffer(ptr,a,b,c,d);|
  1648.   5:
  1649.    CopyBuffer2Video(ptr,a,b,c,d);|
  1650.   6:
  1651.    DrawX(a,b,c,d,e);|
  1652.   7:
  1653.    DrawY(a,b,c,d,e);
  1654.  END (* CASE *);
  1655.  MouseOn;
  1656. END GraphicsLibrary;
  1657.  
  1658. PROCEDURE MouseLibrary(cmd     : CARDINAL;
  1659.                        seg,ofs : CARDINAL);
  1660. VAR x,y : CARDINAL;
  1661.     b   : MouseButtonSet;
  1662. BEGIN
  1663.  CASE cmd OF
  1664.   0:
  1665.    MouseReset;|
  1666.   1:
  1667.    MouseOn;|
  1668.   2:
  1669.    MouseOff;|
  1670.   3:
  1671.    GetMouseData;
  1672.  END (* CASE *);
  1673. END MouseLibrary;
  1674.  
  1675. PROCEDURE DisplayLibrary(cmd     : CARDINAL;
  1676.                          a,b,c   : CARDINAL;
  1677.                          seg,ofs : CARDINAL);
  1678. VAR adr,ptr : ADDRESS;
  1679. BEGIN
  1680.  adr.SEG := seg;
  1681.  adr.OFS := ofs;
  1682.  ptr.SEG := a;
  1683.  ptr.OFS := b;
  1684.  CASE cmd OF
  1685.   0:
  1686.    OpenScreen(TRUE);|
  1687.   1:
  1688.    CloseScreen;|
  1689.   2:
  1690.    OpenWindow(adr);|
  1691.   3:
  1692.    SetAPen(a);|
  1693.   4:
  1694.    SetBPen(a);|
  1695.   5:
  1696.    xMove(a,b);|
  1697.   6:
  1698.    Text(adr);|
  1699.   7:
  1700.    ShowMenu(adr);|
  1701.   8:
  1702.    ShowHelp(adr,ptr);|
  1703.   9:
  1704.    ShowGadget(adr);|
  1705.   10:
  1706.    MoveWindow(a,b);|
  1707.   11:
  1708.    SizeWindow(a,b);|
  1709.   12:
  1710.    CloseWindow;|
  1711.   13:
  1712.    CenterText(a,adr);|
  1713.   14:
  1714.    IF (tdos^.firstWindow^.firstGadget # NIL) THEN
  1715.     RedrawGadget(tdos^.firstWindow^.firstGadget);
  1716.    END (* IF *);|
  1717. (*
  1718.   15:
  1719.    ModifyProp(adr,a,b);|
  1720.   16:
  1721.    LineH(a,b,c);|
  1722.   17:
  1723.    LineV(a,b,c);|
  1724.   18:
  1725.    Char(a,b,c);|
  1726.   19:
  1727.    Box(a,b,c,seg);|        *)
  1728.   0FFH:
  1729.    SystemManager;
  1730.  END (* CASE *);
  1731. END DisplayLibrary;
  1732.  
  1733. PROCEDURE SpecialLibrary(cmd : CARDINAL);
  1734. VAR win : WindowPtr;
  1735. BEGIN
  1736.  CASE cmd OF
  1737.   0:
  1738.    MouseOff;
  1739.    win := tdos^.firstWindow;
  1740.    IF (win # NIL) THEN
  1741.     CopyVideo2Buffer(win^.buffer,win^.leftEdge,win^.topEdge,win^.width,win^.height);
  1742.    END (* IF *);
  1743.    MouseOn;
  1744.    CloseScreen;|
  1745.   1:
  1746.    OpenScreen(FALSE);
  1747.    MouseOff;
  1748.    IF (tdos^.firstWindow # NIL) THEN
  1749.     RestoreWindows(tdos^.firstWindow);
  1750.    END (* IF *);
  1751.    MouseOn;
  1752.  END (* CASE *);
  1753. END SpecialLibrary;
  1754.  
  1755. PROCEDURE TurboDOSInterrupt;
  1756. BEGIN
  1757.  ASM
  1758. x00:               (* 00: GraphicsLibrary(AL,BX,CX,DX,DS,SI,ES,DI) *)
  1759.    CMP AH,0
  1760.    JNE x01
  1761.    XOR AH,AH
  1762.    PUSH AX
  1763.    PUSH BX
  1764.    PUSH CX
  1765.    PUSH DX
  1766.    PUSH DS
  1767.    PUSH SI
  1768.    PUSH ES
  1769.    PUSH DI
  1770.    CALL GraphicsLibrary
  1771.    IRET
  1772. x01:
  1773.    CMP AH,1        (* 01: MouseLibrary(AL,ES,DI) *)
  1774.    JNE x02
  1775.    XOR AH,AH
  1776.    PUSH AX
  1777.    PUSH ES
  1778.    PUSH DI
  1779.    CALL MouseLibrary
  1780.    IRET
  1781. x02:
  1782.    CMP AH,2        (* 02: DisplayLibrary(AL,BX,CX,DX,ES,DI) *)
  1783.    JNE x03
  1784.    XOR AH,AH
  1785.    PUSH AX
  1786.    PUSH BX
  1787.    PUSH CX
  1788.    PUSH DX
  1789.    PUSH ES
  1790.    PUSH DI
  1791.    CALL DisplayLibrary
  1792.    IRET
  1793. x03:
  1794.    CMP AH,3
  1795.    JNE x04
  1796.    XOR AH,AH
  1797.    PUSH AX
  1798.    CALL SpecialLibrary
  1799.    IRET
  1800. x04:
  1801.    IRET
  1802.  END (* ASM *);
  1803. END TurboDOSInterrupt;
  1804.  
  1805. (* ------ TurboDOS - Hauptprogramm ----------- *)
  1806.  
  1807. PROCEDURE InstallTurboDOS;
  1808. VAR o,s,tasten : CARDINAL;
  1809. BEGIN
  1810.  
  1811.  AX := 0;
  1812.  Trap(033H);
  1813.  IF (AX=0) THEN
  1814.   Crash(noMouse);
  1815.  END (* IF *);
  1816.  tasten := BX;
  1817.  
  1818.  ALLOCATE(tdos,SIZE(TurboDOS));
  1819.  IF (tdos=NIL) THEN
  1820.   Crash(noMemory);
  1821.  END (* IF *);
  1822.  
  1823.  ALLOCATE(tdos^.buffer,videoWidth*videoHeight*2);
  1824.  IF (tdos^.buffer=NIL) THEN
  1825.   Crash(noMemory);
  1826.  END (* IF *);
  1827.  
  1828.  o := OFFSET(oldColors);
  1829.  s := SEGMENT(oldColors);
  1830.  ASM
  1831.   MOV AX,01017H
  1832.   MOV BX,0
  1833.   MOV CX,16
  1834.   MOV ES,s
  1835.   MOV DX,o
  1836.   INT 010H
  1837.  END (* ASM *);
  1838.  
  1839.  tdos^.videoWidth  := videoWidth;
  1840.  tdos^.videoHeight := videoHeight;
  1841.  tdos^.videoMode   := videoMode;
  1842.  tdos^.version     := version;
  1843.  tdos^.buttonCount := tasten;
  1844.  tdos^.id[0]       := "T";
  1845.  tdos^.id[1]       := "D";
  1846.  tdos^.id[2]       := "O";
  1847.  tdos^.id[3]       := "S";
  1848.  
  1849.  tdos^.patternScreenBackgrnd := patternScreenBackgrnd;
  1850.  tdos^.patternWindowBackgrnd := patternWindowBackgrnd;
  1851.  
  1852.  tdos^.colorScreenBackgrnd := colorScreenBackgrnd;
  1853.  tdos^.colorHelpBar        := colorHelpBar;
  1854.  tdos^.colorMove           := colorMove;
  1855.  
  1856.  tdos^.colorWindowBackgrnd := colorWindowBackgrnd;
  1857.  tdos^.colorAWindowBorders := colorAWindowBorders;
  1858.  tdos^.colorIWindowBorders := colorIWindowBorders;
  1859.  tdos^.colorWindowAPen     := colorWindowAPen;
  1860.  tdos^.colorWindowBPen     := colorWindowBPen;
  1861.  
  1862.  tdos^.colorGadget         := colorGadget;
  1863.  tdos^.colorGadgetSelected := colorGadgetSelected;
  1864.  tdos^.colorGadgetDisabled := colorGadgetDisabled;
  1865.  
  1866.  tdos^.colorMenuBar        := colorMenuBar;
  1867.  tdos^.colorMenuEnabled    := colorMenuEnabled;
  1868.  tdos^.colorMenuDisabled   := colorMenuDisabled;
  1869.  tdos^.colorMenuSelected   := colorMenuSelected;
  1870.  tdos^.colorMenuBorder     := colorMenuBorder;
  1871.  
  1872.  timerCounter := 0;
  1873.  timerUpdate  := TRUE;
  1874.  
  1875.  GetVector(memoryVector,oldVector1);
  1876.  GetVector(interruptVector,oldVector2);
  1877.  GetVector(timerVector,oldVector3);
  1878.  ResetVector(memoryVector,tdos);
  1879.  SetVector(interruptVector,TurboDOSInterrupt);
  1880.  TurboSys.OpenScreen;
  1881.  SetVector(timerVector,TimerInterrupt);
  1882. END InstallTurboDOS;
  1883.  
  1884. PROCEDURE RemoveTurboDOS;
  1885. VAR o,s : CARDINAL;
  1886. BEGIN
  1887.  TurboSys.CloseScreen;
  1888.  
  1889.  o := OFFSET(oldColors) ;
  1890.  s := SEGMENT(oldColors);
  1891.  ASM
  1892.   MOV AX,01012H
  1893.   MOV BX,0
  1894.   MOV CX,16
  1895.   MOV ES,s
  1896.   MOV DX,o
  1897.   INT 010H
  1898.  END (* ASM *);
  1899.  
  1900.  ResetVector(timerVector,oldVector3);
  1901.  ResetVector(memoryVector,oldVector1);
  1902.  ResetVector(interruptVector,oldVector2);
  1903.  
  1904.  DEALLOCATE(tdos^.buffer,tdos^.videoSize);
  1905.  DEALLOCATE(tdos,SIZE(TurboDOS));
  1906. END RemoveTurboDOS;
  1907.  
  1908. PROCEDURE Crash(error : CARDINAL);
  1909. BEGIN
  1910.  AX := 3;
  1911.  Trap(010H);
  1912.  CASE error OF
  1913.   noMouse:
  1914.    WriteString("TurboDOS benötigt eine Maus!");|
  1915.   noMemory:
  1916.    WriteString("Nicht genug freier Speicher!");
  1917.  END (* CASE *);
  1918.  WriteLn;
  1919.  WriteLn;
  1920.  Terminate(0);
  1921. END Crash;
  1922.  
  1923. PROCEDURE Break;
  1924. BEGIN
  1925.  RemoveTurboDOS;
  1926.  Terminate(0);
  1927. END Break;
  1928.  
  1929. BEGIN
  1930.  
  1931.  IF (tdos=NIL) THEN
  1932.   InstallTurboDOS;
  1933.  
  1934. (*
  1935.  a := TurboSys.ExecuteApplication("test.exe","/1",FALSE);
  1936.  a := TurboSys.ExecuteApplication("c:\dos\command.com","",TRUE);
  1937. *)
  1938.  
  1939.  t1 := " Fenster #1 ";
  1940.  t2 := " Fenster #2 ";
  1941.  t3 := " Fenster #3 ";
  1942.  w1 := TurboSys.OpenWindow(" Fenster #1 ",7,1,550,700,
  1943.                       WindowFlagSet{windowClose,windowDrag,windowSizing,windowDepth},10,3);
  1944.  w2 := TurboSys.OpenWindow(" Fenster #2 ",10,3,55,7,
  1945.                       WindowFlagSet{windowClose,windowDrag,windowSizing,windowDepth},10,3);
  1946.  w4 := TurboSys.OpenWindow(" Fenster #3 ",13,5,55,7,
  1947.                       WindowFlagSet{windowClose,windowDrag,windowSizing,windowDepth},10,3);
  1948.  w5 := TurboSys.OpenWindow(" Fenster #4 ",16,7,55,7,
  1949.                       WindowFlagSet{windowClose,windowDrag,windowSizing,windowDepth},10,3);
  1950.  w3 := TurboSys.OpenWindow(" Fenster #5 ",19,8,55,13,
  1951.                       WindowFlagSet{windowClose,windowDrag,windowSizing,windowDepth},10,3);
  1952.  m2.nextMenu     := NIL;
  1953.  m2.title        := "Test-Menü";
  1954.  m2.leftEdge     := 20;
  1955.  m2.itemLeftEdge := 19;
  1956.  m2.itemWidth    := 25;
  1957.  m2.itemCount    := 3;
  1958.  m2.items[0] := "Item Nummer 1";
  1959.  m2.flags[0] := check;
  1960.  m2.items[1] := "Item Nummer 2";
  1961.  m2.flags[1] := check;
  1962.  m2.items[2] := "Item Nummer 3";
  1963.  m2.flags[2] := check;
  1964.  
  1965.  m1.nextMenu     := ADR(m2);
  1966.  m1.title        := "Projekt";
  1967.  m1.info         := "Hier können Dateioperationen ausgeführt werden.";
  1968.  m1.leftEdge     := 2;
  1969.  m1.itemLeftEdge := 1;
  1970.  m1.itemWidth    := 25;
  1971.  m1.itemCount    := 7;
  1972.  m1.items[0] := "Neu";
  1973.  m1.flags[0] := stdItem;
  1974.  m1.help[0]  := "Es wird ein neues Projekt angelegt...";
  1975.  
  1976.  m1.items[1] := "";
  1977.  m1.flags[1] := bar;
  1978.  
  1979.  m1.items[2] := "Laden";
  1980.  m1.flags[2] := stdItem;
  1981.  m1.help[2]  := "Ein altes Projekt wird geladen...";
  1982.  
  1983.  m1.items[3] := "Sichern";
  1984.  m1.flags[3] := ItemFlagSet{disabled};
  1985.  
  1986.  m1.items[4] := "Sichern als";
  1987.  m1.flags[4] := stdItem;
  1988.  m1.help[4]  := "Das aktuelle Projekt wird unter neuem Namen gesichert...";
  1989.  
  1990.  m1.items[5] := "";
  1991.  m1.flags[5] := bar;
  1992.  
  1993.  m1.items[6] := "Programmende";
  1994.  m1.flags[6] := stdItem;
  1995.  m1.help[6]  := "Das Programm wird beendet...";
  1996.  TurboSys.ShowMenu(ADR(m1));
  1997.  
  1998.  g7.nextGadget := NIL;
  1999.  g7.leftEdge := 30;
  2000.  g7.topEdge := 2;
  2001.  g7.width := 1;
  2002.  g7.height := 10;
  2003.  g7.type := propGadget;
  2004.  g7.id := 106;
  2005.  g7.enabled := TRUE;
  2006.  g7.propV := TRUE;
  2007.  g7.propMax := 400;
  2008.  g7.propPos := 0;
  2009.  
  2010.  g6.nextGadget := ADR(g7);
  2011.  g6.leftEdge := 2;
  2012.  g6.topEdge := 11;
  2013.  g6.width := 10;
  2014.  g6.height := 1;
  2015.  g6.type := propGadget;
  2016.  g6.id := 105;
  2017.  g6.enabled := TRUE;
  2018.  g6.propV := FALSE;
  2019.  g6.propMax := 400;
  2020.  g6.propPos := 0;
  2021.  
  2022.  g5.nextGadget := ADR(g6);
  2023.  g5.leftEdge := 2;
  2024.  g5.topEdge := 10;
  2025.  g5.width := 3;
  2026.  g5.height := 1;
  2027.  g5.type := toggleGadget;
  2028.  g5.id := 104;
  2029.  g5.enabled := TRUE;
  2030.  g5.help := "Toggle-Select-Gadget";
  2031.  
  2032.  g4.nextGadget := ADR(g5);
  2033.  g4.leftEdge := 2;
  2034.  g4.topEdge := 9;
  2035.  g4.width := 20;
  2036.  g4.height := 1;
  2037.  g4.type := strGadget;
  2038.  g4.id := 103;
  2039.  g4.enabled := TRUE;
  2040.  g4.help := "Geben Sie einen String ein!";
  2041.  ALLOCATE(g4.buffer,100);
  2042.  t3 := "String-Gadget";
  2043.  Assign(t3,g4.buffer^);
  2044.  
  2045.  g3.nextGadget := ADR(g4);
  2046.  g3.leftEdge := 2;
  2047.  g3.topEdge := 7;
  2048.  g3.width := 0;
  2049.  g3.height := 1;
  2050.  g3.text := "<Gadget #2>";
  2051.  g3.type := boolGadget;
  2052.  g3.id := 102;
  2053.  g3.enabled := FALSE;
  2054.  
  2055.  g2.nextGadget := ADR(g3);
  2056.  g2.leftEdge := 2;
  2057.  g2.topEdge := 5;
  2058.  g2.width := 0;
  2059.  g2.height := 1;
  2060.  g2.text := "<COMMAND.COM>";
  2061.  g2.type := boolGadget;
  2062.  g2.id := 101;
  2063.  g2.enabled := TRUE;
  2064.  g2.help := "Aufruf des Kommandointerpreters...";
  2065.  
  2066.  g1.nextGadget := ADR(g2);
  2067.  g1.leftEdge := 2;
  2068.  g1.topEdge := 3;
  2069.  g1.width := 0;
  2070.  g1.height := 1;
  2071.  g1.text := "<Gadget #1>";
  2072.  g1.type := boolGadget;
  2073.  g1.id := 100;
  2074.  g1.enabled := TRUE;
  2075.  g1.help := "Dies ist Gadget 1";
  2076.  TurboSys.ShowGadget(ADR(g1));
  2077.  
  2078.  TurboSys.Move(15,6);
  2079.  TurboSys.SetAPen(9);
  2080.  TurboSys.SetBPen(3);
  2081.  TurboSys.Text("TurboDOS ");
  2082.  TurboSys.Text("Version 1.0");
  2083.  
  2084. (*
  2085.  w6 := TurboSys.OpenWindow(" System Request ",15,10,50,8,
  2086.                        WindowFlagSet{windowClose,requester},10,3);
  2087.  TurboSys.CenterText(3,"SYSTEM-REQUESTER");
  2088.  TurboSys.CenterText(5,"Dies ist ein System-Requester!");
  2089.  TurboSys.CenterText(6,"Klicken Sie auf das Schließgadget, um");
  2090.  TurboSys.CenterText(7,"den Requester zu schließen.");
  2091. *)
  2092.  
  2093.  InstallBreakHandler(Break);
  2094.  EnableBreak;
  2095.  
  2096. (*
  2097.  REPEAT
  2098.   TurboSys.SystemManager;
  2099.  UNTIL (tdos^.message.class=SysMsgClassSet{closeWindow});
  2100.  TurboSys.CloseWindow;
  2101. *)
  2102.  
  2103.  w6 := NIL;
  2104.  REPEAT
  2105.   TurboSys.SystemManager;
  2106.   IF (closeWindow IN tdos^.message.class) THEN
  2107.    w6 := tdos^.message.window;
  2108.    IF (w6=w1) THEN TurboSys.CloseWindow; w1 := NIL; END;
  2109.    IF (w6=w2) THEN TurboSys.CloseWindow; w2 := NIL; END;
  2110.    IF (w6=w4) THEN TurboSys.CloseWindow; w4 := NIL; END;
  2111.    IF (w6=w5) THEN TurboSys.CloseWindow; w5 := NIL; END;
  2112.   ELSIF (gadgetUp IN tdos^.message.class) THEN
  2113.    IF (tdos^.message.gadgetID=101) THEN
  2114.     a := TurboSys.ExecuteApplication("c:\dos\command.com","",TRUE);
  2115.    END (* IF *);
  2116.   END (* IF *);
  2117.  UNTIL (w6=w3);
  2118.  
  2119.  UninstallBreakHandler;
  2120.  
  2121.  
  2122.  
  2123.  
  2124.  
  2125.   RemoveTurboDOS;
  2126.  ELSE
  2127.   WriteString("TurboDOS wurde bereits gestartet!");
  2128.   WriteLn;
  2129.  END (* IF *);
  2130.  
  2131. END Turbo.
  2132.